﻿using BooksLib.Models;
using BooksLib.Repositories;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BooksLib.Services
{
    public class StudentService : IStudentService
    {
        // ObservableCollection<T>表示一个动态数据集合，它可在添加、删除项目或刷新整个列表时提供通知
        private ObservableCollection<Student> _students = new ObservableCollection<Student>();

        //在构造函数中依赖注入存储库，使得业务处理与数据访问分离
        private IStudent _IStudentRepository;
        public StudentService(IStudent repository)
        {
            //将外部存储库实例注入内部私有变量
            _IStudentRepository = repository;
        }

        public IEnumerable<Student> Students => throw new NotImplementedException();


        public async Task<Student> AddOrUpdateStudentAsync(Student student)
        {
            //如果student为null,抛空异常
            if (student is null) throw new ArgumentNullException(nameof(student));

            //设置一个Student变量updated，用以返回在添加或删除操作后从存储库中传回的学生信息
            Student updated = null;

            //根据StudentId判断用户操作是添加还是更新，从而采取不同的仓储策略
            if (student.StudentId == 0)
            {
                //添加操作，调用存储库添加方法，将学生信息添加到存储库
                updated = await _IStudentRepository.AddAsync(student);
                //同步添加到私有数据集中
                _students.Add(updated);
            }
            else
            {
                //更新操作调用存储库添加方法，将书更新到存储库
                updated = await _IStudentRepository.UpdateAsync(student);
                //如果更新存储库返回null，抛出无效操作异常
                if (updated == null) throw new InvalidOperationException();

                //同步处理私有数据集
                //检索私有数据集中对应的原数据
                Student old = _students.Where(b => b.StudentId == updated.StudentId).Single();
                //找出其索引
                int ix = _students.IndexOf(old);
                //将其从数据集中移除
                _students.RemoveAt(ix);
                //将新数据插入到指定索引位置
                _students.Insert(ix, updated);
            }
            return updated;
        }

        public Student GetStudent(int studentId)
        {
            //按指定id查询私有数据集，返回对应学生信息/默认值。如果有两个及以上的数据
            return _students.Where(b => b.StudentId == studentId).SingleOrDefault();
        }

        public async Task LoadStudentAsync()
        {
            //若私有数据集有数据，则无须再次导入
            if (_students.Count > 0) return;

            //从存储库中调用异步方法获取所有数据
            IEnumerable<Student> books = await _IStudentRepository.GetItemsAsync();

            //为了确保数据集中所有数据都来自存储库，将原私有数据集清除。
            _students.Clear();

            //将从仓储库中读取到的数据加入私有数据集中
            foreach (var b in books)
            {
                _students.Add(b);
            }
        }
        public IEnumerable<Student> Students => _students;
    }
}
